package bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

import bean.vo.FacturaVO;
import bean.vo.ItemFacturaVO;

@Entity 
@Table( name = "facturas" )
@SuppressWarnings({"unchecked"})
public class Factura extends EntidadPersistente {
	private int numeroFactura;
	private Date fechaEmision;
	private Date fechaVencimiento;
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Cliente cliente;
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private CondicionPago condicionPago;
	private float monto;
	private float descuentoEfectivo;
	@OneToMany (cascade = CascadeType.ALL, mappedBy = "factura")
	private List<ItemFactura> itemsFactura;
	
	public Factura () {
		this.itemsFactura = new ArrayList<ItemFactura>();
	}
	
	public Factura (int numeroFactura, Date fechaEmision, Date fechaVencimiento, Cliente cliente, CondicionPago condicionPago) {
		this.numeroFactura = numeroFactura;
		this.fechaEmision = fechaEmision;
		this.fechaVencimiento = fechaVencimiento;
		this.cliente = cliente;
		this.condicionPago = condicionPago;
		this.itemsFactura = new ArrayList<ItemFactura>();
	}
	
	public FacturaVO getVO() {
		FacturaVO vo = new FacturaVO();
		vo.setCliente(cliente != null ? cliente.getVO() : null);
		vo.setCondicionPago(condicionPago != null ? condicionPago.getVO() : null);
		vo.setDescuentoEfectivo(descuentoEfectivo);
		vo.setFechaEmision(fechaEmision);
		vo.setFechaVencimiento(fechaVencimiento);
		vo.setItemsFactura(new VOList<ItemFacturaVO>().getVoList(itemsFactura));
		vo.setMonto(monto);
		vo.setNumeroFactura(numeroFactura);
		
		return vo;
	}
	
	public int getNumeroFactura() {
		return numeroFactura;
	}
	
	public void setNumeroFactura(int numeroFactura) {
		this.numeroFactura = numeroFactura;
	}
	
	public Date getFechaEmision() {
		return fechaEmision;
	}
	
	public void setFechaEmision(Date fechaEmision) {
		this.fechaEmision = fechaEmision;
	}
	
	public Cliente getCliente() {
		return cliente;
	}
	
	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}
	
	public CondicionPago getCondicionPago() {
		return condicionPago;
	}
	
	public void setCondicionPago(CondicionPago condicionPago) {
		this.condicionPago = condicionPago;
	}
	
	public Float getMonto() {
		return monto;
	}
	
	public void setMonto(Float monto) {
		this.monto = monto;
	}
	
	public List<ItemFactura> getItemsFactura() {
		return itemsFactura;
	}
	
	public void setItemsFactura(List<ItemFactura> itemsFactura) {
		this.itemsFactura = itemsFactura;
	}
	
	public void agregarItem(ProductoEntregado producto, Float precio) {
		ItemFactura item = new ItemFactura(this, producto, precio);
		
		if (!itemsFactura.contains(item))
		{
			monto += producto.getCantidadEnviada() * item.getPrecio();
			itemsFactura.add(item);
		}
	}
	
	public void eliminarItem(ProductoEntregado producto)
	{
		ItemFactura item = new ItemFactura(this, producto, 0);
		
		if (itemsFactura.contains(item))
		{
			monto -= producto.getCantidadEnviada() * item.getPrecio();
			itemsFactura.remove(item);
		}
	}

	public Float getDescuentoEfectivo() {
		return descuentoEfectivo;
	}

	public void setDescuentoEfectivo(Float descuentoEfectivo) {
		this.descuentoEfectivo = descuentoEfectivo;
	}

	public Date getFechaVencimiento() {
		return fechaVencimiento;
	}

	public void setFechaVencimiento(Date fechaVencimiento) {
		this.fechaVencimiento = fechaVencimiento;
	}
}
